package cz.fimuni.pa165.backendapi.facade;

import cz.fimuni.pa165.backendapi.dto.CarDTO;
import cz.fimuni.pa165.backendapi.dto.CompanyDTO;
import cz.fimuni.pa165.backendapi.dto.EmployeeDTO;
import cz.fimuni.pa165.backendapi.dto.RequestDTO;
import cz.fimuni.pa165.backendapi.dto.ReservationDTO;
import java.util.List;

public interface ServiceFacade {

    /**
     *
     * Uloží do databáze objekt typu CarDTO
     *
     * @param c objekt typu CarDTO, který se má vytvořit
     */
    void addCar(CarDTO c);

    /**
     * Pridá do databázy novú firmu
     *
     * @param c firma, ktorá má byť pridaná
     */
    void addCompany(CompanyDTO c);

    /**
     * Vytvorí v databáze záznam o danom zamestnancovi.
     *
     * @param empDTO zamestnanec, ktorého údaje sa majú uložiť
     */
    void addEmployee(EmployeeDTO empDTO);

    /**
     * V databaze rezervacii sa vytvori novy zaznam
     *
     * @param res novovzniknuta rezervacia, ktora sa ma ulozit
     */
    void addReservation(ReservationDTO res);

    /**
     * Vráti zoznam všetkých zamestnancov vo všetkých firmách
     *
     * @return zoznam všetkých zamestnancov
     */
    public List<EmployeeDTO> getAllEmployees();

    /**
     * Vráti zoznam všetkých zamestnancov s daným priezviskom
     *
     * @param surname priezvisko, podľa ktorého sa hľadá.
     * @return zoznam zamestnancov s daným priezviskom, inak null
     */
    List<EmployeeDTO> findEmployeeByName(String surname);
    
    /**
     * Vráti zoznam všetkých zamestnancov s daným username
     *
     * @param username uzivatelske meno, podľa ktorého sa hľadá.
     * @return zoznam zamestnancov s daným uzivatelskym menom, inak null
     */
    List<EmployeeDTO> findEmployeeByUsername(String username);

    /**
     * Vráti zoznam všetkých zamestnancov, patriacich do danej firmy.
     *
     * @param compDTO firma, do ktorej majú zamestnanci patriť
     * @return Zoznam zamestnancov danej firmy, ak firma nemá zamestnancov,
     * vráti prázdny zoznam, ak firma neexistuje, vráti null
     */
    List<EmployeeDTO> findEmployeesByCompany(CompanyDTO compDTO);

    /**
     * Vrátí všechny auta v systému
     *
     * @return List<Car>, pokud jsou v systému auta, jinak null
     */
    List<CarDTO> getAllCars();

    /**
     * Vráti zoznam všetkých firiem
     *
     * @return zoznam všetkých firiem z databázy
     */
    List<CompanyDTO> getAllCompanies();

    /**
     * Vyhľadá auto podľa id a údaje vráti v objekte CarDTO.
     *
     * @param id Id hľadaného auta.
     * @return objekt typu CarDTO. Null, ak auto neexistuje.
     */
    CarDTO find(Long id);

    /**
     * Podla identifikatora vyhlada a vrati rezervaciu.
     *
     * @param id identifikátor hladanej rezervacie
     * @return Pozadovanu rezervaciu
     */
    ReservationDTO getByID(Long id);

    /**
     * Vyhľadá zamestnanca s daným id a vráti jeho údaje uložené v objekte
     * triedy Employee. Ak zamestnanec s daným id neexistuje, vráti null.
     *
     * @param id id hľadaného zamestnanca.
     * @return údaje o hľadanom zamestnancovi ako objekt triedy Employee, alebo
     * null, ak hľadaný zamestnanec neexistuje.
     */
    EmployeeDTO getEmployeeById(Long id);

    /**
     * Vyhľadá firmu s daným id a vráti jej údaje uložené v objekte triedy
     * CompanyDTO. Ak firma s daným id neexistuje, vráti null.
     *
     * @param id id hľadanej firmy.
     * @return údaje o hľadanej firme ako objekt triedy CompanyDTO, alebo null,
     * ak hľadaná firma neexistuje.
     */
    CompanyDTO getCompanyById(Long id);

    /**
     * Na zaklade id zamestnanca vyhlada jeho rezervacie a vrati naspat ich
     * zoznam
     *
     * @param empl zamestnanec, ktoreho rezervacie sa vyhladaju
     * @return zoznam zamestnancovych rezervacii
     */
    List<ReservationDTO> getReservationByEmployee(EmployeeDTO empl);

    /**
     * Metóda, ktorá na základe zadaných požiadaviek vráti zoznam áut
     * vyhovujúcich týmto požiadavkám.
     *
     * @param request požiadavky užívateľa na auto ako objekt typu RequestDTO
     * @return zoznam áut, ktoré vyhovujú požiadavkám, ak žiadne auto
     * nevyhovuje, vráti null
     */
    List<CarDTO> processRequest(RequestDTO request);

    /**
     * Smaže object Car z databáze
     *
     * @param c objekt typu Car určený k odstranění z databáze
     */
    void removeCar(CarDTO c);

    /**
     * Zmaže z databázy danú firmu (firma s rovankým id ako má parameter). Ak sa
     * firma v databáze nenachádza, neurobí nič.
     *
     * @param c firma, ktorá má byť vymazaná
     * @throws DataAccessException ak nastane problém na vrstve perzistencie dát
     */
    void removeCompany(CompanyDTO c);

    /**
     * Odstráni zamestnanca z databázy. Ak sa zamestnanec v databáze nenachádza,
     * metóda neurobí nič.
     *
     * @param empDTO zamestnanec, ktorý má byť odstránený
     */
    void removeEmployee(EmployeeDTO empDTO);

    /**
     * Vyhlada v databaze zaznam rezervacie s rovnakym id a vymaze tento zaznam
     *
     * @param res rezervacia, ktora sa ma vymazat
     */
    void removeReservation(ReservationDTO res);

    /**
     * Aktualizuje záznam o autě
     *
     * @param c Instance Car, která má být aktualizována
     * @return true, pokud se aktualizace provedla, jinak false
     */
    void updateCar(CarDTO c);

    /**
     * Upraví záznam o firme.
     *
     * @param c firma s upravenými údajmi, ktoré majú byť uložené
     * @return true, ak sa podarí upraviť údaje, false inak
     */
    boolean updateCompany(CompanyDTO c);

    /**
     * vyhľadá zamestnanca, ktorého id je rovnaké ako id parametru metódy a
     * upraví jeho údaje tak, aby sa zhodovali s údajmi zamestnanca, ktorý je
     * parametrom metódy a vráti true. Inak vráti false.
     *
     * @param empDTO zamestnanec, ktorého údaje majú byť upravené
     * @return true, ak sa podarí upraviť údaje zamestnanca, false inak.
     */
    void updateEmployee(EmployeeDTO empDTO);

    /**
     * Vrati zoznam vsetkych rezervacii
     * @return zoznam vsetkych rezervacii
     */
    List<ReservationDTO> getAllReservations();
}
